/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package stud.cp.user.plugins.object;

import java.math.BigInteger;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.ejb.Stateless;
import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger;
import stud.cp.core.dbaccess.DAOException;
import stud.cp.core.plugins.PluginConst;
import stud.cp.core.plugins.PluginRouter;
import stud.cp.core.plugins.WrongPageRequest;
import stud.cp.user.dbaccess.HistoryDAO;
import stud.cp.user.dbaccess.OracleDAOFactory;
import stud.cp.user.dbaccess.ListValuesDAO;
import stud.cp.user.dbaccess.ParametersDAO;
import stud.cp.user.dbaccess.ObjectDAO;
import stud.cp.user.dbaccess.ObjectReferencesDAO;
import stud.cp.user.valueobjects.History;
import stud.cp.user.valueobjects.Property;
import stud.cp.user.valueobjects.PropertyListValue;
import stud.cp.user.valueobjects.PropertyTypeDef;
import stud.cp.user.valueobjects.Parameter;
import stud.cp.user.valueobjects.User;
import stud.cp.user.valueobjects.DBObject;
import stud.cp.user.valueobjects.DBObjectReference;
import stud.cp.user.valueobjects.DBObjectType;

/**
 * Класс, отвечающий за логику работы
 * элемента выводящего списки оружия.
 * @author Morfant
 */
@Stateless
public class ObjectPluginBean implements ObjectPluginLocal {

    /**
     * Фабрика DAO классов.
     */
    private OracleDAOFactory oracleDAOFactory = null;
    /**
     * Логгер.
     */
    private static Logger logger = Logger.getLogger("ACPII");

    /**
     * Метод, который выполняет
     * конкретые действия,
     * заложенные в плагин.
     * @param req Реквест.
     * @return Класс, роутер.
     */
    @Override
    public PluginRouter perform(HttpServletRequest req) {
        String subaction = req.getParameter(PluginConst.SUBACTION);
        if ((subaction != null) && (!subaction.equals(""))) {

            try {

                oracleDAOFactory = new OracleDAOFactory();
                oracleDAOFactory.initialize();

                /* Список действий которые могут выполниться. */
                if (subaction.equals(PluginConst.GET_WEAPON_TYPE_LIST_PAGE)) {
                    return getObjectTypeListPage(req);
                }

                /*Список оружия конкретного типа оружуия */
                if (subaction.equals(PluginConst.GET_LIST)) {
                    return getListPage(req);
                }

                /*Страница добавления*/
                if (subaction.equals(PluginConst.GET_ADD_PAGE)) {
                    return getAddPage(req);
                }

                /*Добавление новых данных*/
                if (subaction.equals(PluginConst.NEW_DATA)) {
                    return newData(req);
                }


                /*Страница редактирования*/
                if (subaction.equals(PluginConst.GET_EDIT_PAGE)) {
                    return getEditPage(req);
                }

                /*Сохранение измененных данных*/
                if (subaction.equals(PluginConst.SAVE_DATA)) {
                    return saveData(req);
                }

                /*Страница удаления*/
                if (subaction.equals(PluginConst.GET_DELETE_PAGE)) {
                    return getDeletePage(req);
                }

                /*Удаление данные*/
                if (subaction.equals(PluginConst.DELETE_DATA)) {
                    return deleteData(req);
                }

                /*Страница просмотра данных о типе оружия*/
                if (subaction.equals(PluginConst.GET_VIEW_PAGE)) {
                    return getViewPage(req);
                }

                /*Страница истории*/
                if (subaction.equals(PluginConst.GET_HISTORY_PAGE)) {
                    return getHistoryPage(req);
                }

                req.setAttribute(PluginConst.ERROR_MESSAGE,
                        "Действия для данного типа поддействия не найдено. Тип поддействия = " + subaction);
            } catch (DAOException ex) {
                logger.debug("Error due access to database. "
                        + "Plugin = ObjectTypePluginBean. "
                        + "Subaction=" + subaction, ex);
                req.setAttribute(PluginConst.ERROR_MESSAGE,
                        "Ошибка доступа к базе данных " + ex.getMessage());
            } catch (WrongPageRequest ex) {
                req.setAttribute(PluginConst.ERROR_MESSAGE,
                        "Данные из реквеста ошибочны :\n" + ex.getMessage());
            } finally {
                if (oracleDAOFactory != null) {
                    try {
                        oracleDAOFactory.cleanUp();
                    } catch (DAOException ex) {
                        logger.debug("Error due access to database. "
                                + "Plugin = ObjectTypePluginBean. "
                                + "Subaction=" + subaction, ex);
                        req.setAttribute(PluginConst.ERROR_MESSAGE,
                                "Ошибка доступа к данным. " + ex.getMessage());
                    }
                }
            }
        } else {
            req.setAttribute(PluginConst.ERROR_MESSAGE,
                    "Тип поддействия не задан.");
        }
        return new PluginRouter("/errorpage.jsp");
    }

    /**
     * Метод, который позволяет получить
     * список данных запрашиваемого типа.
     * @param req Реквест.
     * @return PluginRouter на страницу в который будет выводиться список.
     * @throws DAOException Ошибки доступа к базе данных.
     */
    private PluginRouter getObjectTypeListPage(HttpServletRequest req) throws DAOException, WrongPageRequest {
        req.setAttribute(PluginConst.OBJECT_TYPE_LIST, oracleDAOFactory.getObjectTypesDAO().getAll());
        return new PluginRouter("/Object/ObjectTypesTable.jsp");
    }

    /**
     * Метод, который позволяет получить
     * список данных запрашиваемого типа.
     * @param req Реквест.
     * @return PluginRouter на страницу в который будет выводиться список.
     * @throws DAOException Ошибки доступа к базе данных.
     */
    private PluginRouter getListPage(HttpServletRequest req) throws DAOException, WrongPageRequest {
        String object_type_id = req.getParameter(PluginConst.OBJECT_TYPE_ID);
        if (object_type_id != null) {
            DBObjectType objectType =
                    oracleDAOFactory.getObjectTypesDAO().getById(new BigInteger(object_type_id));
            if (objectType != null) {
                List<DBObject> listOfObject =
                        oracleDAOFactory.getObjectDAO().getAllObjectByObjectType(new BigInteger(object_type_id));
                req.setAttribute(PluginConst.OBJECT_LIST, listOfObject);
                req.setAttribute(PluginConst.OBJECT_TYPE, objectType);
                return new PluginRouter("/Object/ObjectsTable.jsp");
            } else {
                throw new WrongPageRequest("Тип оружия с таким id=" + object_type_id + " не существует. ");
            }
        } else {
            throw new WrongPageRequest("ID свойства не задан.");
        }
    }

    /**
     * Метод, который позволяет получить
     * страницу добавления.
     * @param req Реквест.
     * @return PluginRouter c запрашиваемой страницей.
     * @throws DAOException Ошибка доступа к базе данных.
     */
    private PluginRouter getAddPage(HttpServletRequest req) throws DAOException, WrongPageRequest {
        String object_type_id = req.getParameter(PluginConst.OBJECT_TYPE_ID);
        if (object_type_id != null) {
            DBObjectType objectType =
                    oracleDAOFactory.getObjectTypesDAO().getById(new BigInteger(object_type_id));
            if (objectType != null) {
                Map<BigInteger, List> mapOfPropertiesValues = new HashMap<BigInteger, List>();
                List<Property> listOfProperties =
                        oracleDAOFactory.getPropertiesDAO().getAllPropertyForObjectType(new BigInteger(object_type_id));
                String propertyType = "";
                PropertyTypeDef propertyTypeDef = null;
                for (Property item : listOfProperties) {
                    if (item.getProperty_type_defs_id() != null) {
                        propertyTypeDef =
                                oracleDAOFactory.getPropertyTypeDefsDAO().getById(item.getProperty_type_defs_id());
                        propertyType = item.getProperty_type_id().toString();
                        if (propertyType.equals(PluginConst.REFERENCE_TYPE)) {
                            mapOfPropertiesValues.put(item.getProperty_id(),
                                    oracleDAOFactory.getObjectDAO().getAllObjectByObjectType(propertyTypeDef.getObject_type_id()));
                        }
                        if (propertyType.equals(PluginConst.LIST_TYPE)) {
                            mapOfPropertiesValues.put(item.getProperty_id(),
                                    oracleDAOFactory.getPropertyListValuesDAO().getAllForListValueDef(propertyTypeDef.getProperty_type_def_id()));
                        }
                    }
                }
                req.setAttribute(PluginConst.PROPERTIES_LIST, listOfProperties);
                req.setAttribute(PluginConst.PROPERTY_VALUE_RESORSES, mapOfPropertiesValues);
                req.setAttribute(PluginConst.OBJECT_TYPE, objectType);
                return new PluginRouter("/Object/AddObject.jsp");
            } else {
                throw new WrongPageRequest("Тип оружия с таким id=" + object_type_id + " не существует. ");
            }
        } else {
            throw new WrongPageRequest("ID свойства не задан.");
        }
    }

    /**
     * Метод, позволяющий добавлять новые данные.
     * @param req Реквест.
     * @return PluginRouter c запрашиваемой страницей.
     * @throws DAOException Ошибка доступа к базе данных.
     * @throws WrongPageRequest Критическая ошибка в данных реквеста.
     */
    private PluginRouter newData(HttpServletRequest req) throws DAOException, WrongPageRequest {
        String name = req.getParameter(PluginConst.OBJECT_NAME);
        String description = req.getParameter(PluginConst.OBJECT_DESCRIPTION);
        String object_type_id = req.getParameter(PluginConst.OBJECT_TYPE_ID);
        String error_message = "";
        if ((name == null) || (name.equals(""))) {
            error_message = error_message + "Имя оружия не должно быть пустым!";
        }
        if ((description == null) || (description.equals(""))) {
            error_message = error_message + " Описание оружия не должно быть пустым.";
        }
        if (error_message.equals("")) {
            DBObjectType objectType = oracleDAOFactory.getObjectTypesDAO().getById(new BigInteger(object_type_id));
            if (objectType != null) {
                BigInteger object_id =
                        oracleDAOFactory.getObjectDAO().create(new DBObject(objectType.getObject_type_id(), name, description));
                List<Property> listOfProperties =
                        oracleDAOFactory.getPropertiesDAO().getAllPropertyForObjectType(objectType.getObject_type_id());
                BigInteger property_id = null;
                String value = "";
                ParametersDAO propertyValueDAO = oracleDAOFactory.getParameterDAO();
                ObjectReferencesDAO objectReferenceDAO = oracleDAOFactory.getObjectReferencesDAO();
                ListValuesDAO propertyListValuesDAO = oracleDAOFactory.getPropertyListValuesDAO();
                ObjectDAO objectDAO = oracleDAOFactory.getObjectDAO();
                HistoryDAO historyDAO = oracleDAOFactory.getHistoryDAO();
                String propertyType = "";
                User user = (User) req.getSession(false).getAttribute(PluginConst.CURRENT_USER);
                for (Property item : listOfProperties) {
                    property_id = item.getProperty_id();
                    propertyType = item.getProperty_type_id().toString();
                    if (propertyType.equals(PluginConst.TEXT_TYPE)) {
                        value = req.getParameter(property_id.toString());
                        propertyValueDAO.create(new Parameter(property_id, value, object_id, null));
                        historyDAO.create(new History(object_id,
                                item.getProperty_id(),
                                user.getUserID(),
                                new Date(System.currentTimeMillis()),
                                value,
                                ""));
                    }
                    if (propertyType.equals(PluginConst.REFERENCE_TYPE)) {
                        value = req.getParameter(property_id.toString());
                        if (!value.equals(PluginConst.DEFAULT_REFERENCE_ID)) {
                            objectReferenceDAO.create(new DBObjectReference(object_id, new BigInteger(value), property_id));
                            historyDAO.create(new History(object_id,
                                    item.getProperty_id(),
                                    user.getUserID(),
                                    new Date(System.currentTimeMillis()),
                                    objectDAO.getById(new BigInteger(value)).getName(),
                                    ""));
                        }
                        propertyValueDAO.create(new Parameter(property_id, "", object_id, null));
                    }
                    if (propertyType.equals(PluginConst.LIST_TYPE)) {
                        value = req.getParameter(property_id.toString());
                        propertyValueDAO.create(new Parameter(property_id, "", object_id, new BigInteger(value)));
                        historyDAO.create(new History(object_id,
                                item.getProperty_id(),
                                user.getUserID(),
                                new Date(System.currentTimeMillis()),
                                propertyListValuesDAO.getById(new BigInteger(value)).getValue(),
                                ""));
                    }
                }
                return new PluginRouter("object-action.do"
                        + "?"
                        + PluginConst.SUBACTION
                        + "="
                        + PluginConst.GET_VIEW_PAGE
                        + "&"
                        + PluginConst.OBJECT_ID
                        + "="
                        + object_id, false);
            } else {
                throw new WrongPageRequest("Тип оружия с таким id=" + object_type_id + " не существует. ");
            }
        } else {
            req.setAttribute(PluginConst.ERROR_MESSAGE, error_message);
            return getAddPage(req);
        }
    }

    /**
     * Метод, который позволяет
     * перейти на страницу редактирования данных.
     * @param req Реквест.
     * @return PluginRouter c запрашиваемой страницей.
     * @throws DAOException Ошибка доступа к базе данных.
     * @throws WrongPageRequest Критическая ошибка в данных реквеста.
     */
    private PluginRouter getEditPage(HttpServletRequest req) throws DAOException, WrongPageRequest {
        String object_id = req.getParameter(PluginConst.OBJECT_ID);
        if (object_id != null) {
            DBObject object =
                    oracleDAOFactory.getObjectDAO().getById(new BigInteger(object_id));
            if (object != null) {
                Map<BigInteger, List> mapOfPropertiesValues = new HashMap<BigInteger, List>();
                List<Parameter> listOfPropertyValue =
                        oracleDAOFactory.getParameterDAO().getPropertyValueForObject(new BigInteger(object_id));
                List<DBObjectReference> listOfObjectReference =
                        oracleDAOFactory.getObjectReferencesDAO().getAllReferenceForObject(new BigInteger(object_id));
                List<Property> listOfProperties =
                        oracleDAOFactory.getPropertiesDAO().getAllPropertyForObjectType(object.getObject_type_id());
                Map<BigInteger, DBObject> referenceObjectMap = new HashMap<BigInteger, DBObject>();
                ObjectDAO objectDAO = oracleDAOFactory.getObjectDAO();
                for (DBObjectReference item : listOfObjectReference) {
                    referenceObjectMap.put(item.getProperty_id(), objectDAO.getById(item.getReference_object_id()));
                }
                String propertyType = "";
                PropertyTypeDef propertyTypeDef = null;
                for (Property item : listOfProperties) {
                    if (item.getProperty_type_defs_id() != null) {
                        propertyTypeDef =
                                oracleDAOFactory.getPropertyTypeDefsDAO().getById(item.getProperty_type_defs_id());
                        propertyType = item.getProperty_type_id().toString();
                        if (propertyType.equals(PluginConst.REFERENCE_TYPE)) {
                            mapOfPropertiesValues.put(item.getProperty_id(),
                                    oracleDAOFactory.getObjectDAO().
                                    getAllObjectByObjectTypeExcludeObject(propertyTypeDef.getObject_type_id(), object.getObject_id()));
                        }
                        if (propertyType.equals(PluginConst.LIST_TYPE)) {
                            mapOfPropertiesValues.put(item.getProperty_id(),
                                    oracleDAOFactory.getPropertyListValuesDAO().getAllForListValueDef(propertyTypeDef.getProperty_type_def_id()));
                        }
                    }
                }
                req.setAttribute(PluginConst.OBJECT, object);
                req.setAttribute(PluginConst.PROPERTY_VALUES_LIST, listOfPropertyValue);
                req.setAttribute(PluginConst.REFERENCE_WEAPON_RESORSES, referenceObjectMap);
                req.setAttribute(PluginConst.PROPERTY_VALUE_RESORSES, mapOfPropertiesValues);
                return new PluginRouter("/Object/EditObject.jsp");
            } else {
                throw new WrongPageRequest("Оружия с таким id=" + object_id + " не существует. ");
            }
        } else {
            throw new WrongPageRequest("ID типа оружия не заданно.");
        }
    }

    /**
     * Сохранение данных.
     * @param req Реквест.
     * @return PluginRouter c запрашиваемой страницей.
     * @throws DAOException Ошибка доступа к базе данных.
     * @throws WrongPageRequest Критическая ошибка в данных реквеста.
     */
    private PluginRouter saveData(HttpServletRequest req) throws DAOException, WrongPageRequest {
        String name = req.getParameter(PluginConst.OBJECT_NAME);
        String description = req.getParameter(PluginConst.OBJECT_DESCRIPTION);
        String object_id = req.getParameter(PluginConst.OBJECT_ID);
        String error_message = "";
        if ((name == null) || (name.equals(""))) {
            error_message = error_message + "Имя оружия не должно быть пустым!";
        }
        if ((description == null) || (description.equals(""))) {
            error_message = error_message + " Описание оружия не должно быть пустым.";
        }
        if (error_message.equals("")) {
            DBObject object = oracleDAOFactory.getObjectDAO().getById(new BigInteger(object_id));
            if (object != null) {
                object.setName(name);
                object.setDescription(description);
                oracleDAOFactory.getObjectDAO().update(object);
                ParametersDAO propertyValueDAO = oracleDAOFactory.getParameterDAO();
                ObjectReferencesDAO objectReferenceDAO = oracleDAOFactory.getObjectReferencesDAO();
                HistoryDAO historyDAO = oracleDAOFactory.getHistoryDAO();
                ListValuesDAO propertyListValuesDAO = oracleDAOFactory.getPropertyListValuesDAO();
                ObjectDAO objectDAO = oracleDAOFactory.getObjectDAO();
                DBObjectReference objectReference = null;
                List<Parameter> listOfPropertyValues =
                        propertyValueDAO.getPropertyValueForObject(object.getObject_id());
                String newValue = "";
                String oldValue = "";
                String propertyType = "";
                User user = (User) req.getSession(false).getAttribute(PluginConst.CURRENT_USER);
                for (Parameter item : listOfPropertyValues) {
                    newValue = req.getParameter(item.getProperty_value_id().toString());
                    propertyType = item.getProperty_type_id().toString();

                    /* Работа с текстовыми свойствами. */
                    if (propertyType.equals(PluginConst.TEXT_TYPE)) {
                        oldValue = (item.getValue() != null) ? item.getValue() : "";

                        /* Проверка на необходимость изменениея данных. */
                        if (!newValue.equals(oldValue)) {
                            historyDAO.create(new History(object.getObject_id(),
                                    item.getProperty_id(),
                                    user.getUserID(),
                                    new Date(System.currentTimeMillis()),
                                    newValue,
                                    oldValue));
                            item.setValue(newValue);
                            propertyValueDAO.update(item);
                        }
                    }

                    /* Работа со списочными свойствами. */
                    if (propertyType.equals(PluginConst.LIST_TYPE)) {
                        oldValue = (item.getProperty_list_value_id() != null)
                                ? item.getProperty_list_value_id().toString() : "";

                        /* Проверка на необходимость изменениея данных. */
                        if (!newValue.equals(oldValue)) {
                            historyDAO.create(new History(object.getObject_id(),
                                    item.getProperty_id(),
                                    user.getUserID(),
                                    new Date(System.currentTimeMillis()),
                                    propertyListValuesDAO.getById(new BigInteger(newValue)).getValue(),
                                    (!oldValue.equals(""))
                                    ? item.getProperty_list_value() : ""));
                            item.setProperty_list_value_id(new BigInteger(newValue));
                            propertyValueDAO.update(item);
                        }
                    }

                    /* Работа со ссылочными свойствами */
                    if (propertyType.equals(PluginConst.REFERENCE_TYPE)) {
                        objectReference =
                                objectReferenceDAO.getByObjectIDAndPropertyID(object.getObject_id(), item.getProperty_id());

                        /* Определение необходимости изменения данных. */
                        if (!newValue.equals(PluginConst.DEFAULT_REFERENCE_ID)) {
                            if (objectReference == null) {
                                historyDAO.create(new History(object.getObject_id(),
                                        item.getProperty_id(),
                                        user.getUserID(),
                                        new Date(System.currentTimeMillis()),
                                        objectDAO.getById(new BigInteger(newValue)).getName(), ""));
                                objectReferenceDAO.create(new DBObjectReference(object.getObject_id(), new BigInteger(newValue), item.getProperty_id()));
                            } else {
                                if (!newValue.equals(objectReference.getReference_object_id().toString())) {
                                    historyDAO.create(new History(object.getObject_id(),
                                            item.getProperty_id(),
                                            user.getUserID(),
                                            new Date(System.currentTimeMillis()),
                                            objectDAO.getById(new BigInteger(newValue)).getName(),
                                            objectDAO.getById(objectReference.getReference_object_id()).getName()));
                                    objectReference.setReference_object_id(new BigInteger(newValue));
                                    objectReferenceDAO.update(objectReference);
                                }
                            }

                        } else {
                            if ((objectReference != null)
                                    && (!objectReference.getReference_object_id().toString().
                                    equals(PluginConst.DEFAULT_REFERENCE_ID))) {
                                historyDAO.create(new History(object.getObject_id(),
                                        item.getProperty_id(),
                                        user.getUserID(),
                                        new Date(System.currentTimeMillis()),
                                        "",
                                        objectDAO.getById(objectReference.getReference_object_id()).getName()));
                                objectReferenceDAO.delete(objectReference.getObject_reference_id());
                            }
                        }
                    }
                }
                return new PluginRouter("object-action.do"
                        + "?"
                        + PluginConst.SUBACTION
                        + "="
                        + PluginConst.GET_VIEW_PAGE
                        + "&"
                        + PluginConst.OBJECT_ID
                        + "="
                        + object_id, false);
            } else {
                throw new WrongPageRequest("Оружия с таким id=" + object_id + " не существует. ");
            }
        } else {
            req.setAttribute(PluginConst.ERROR_MESSAGE, error_message);
            return getEditPage(req);
        }
    }

    /**
     * Метод, который позволяет
     * перейти на страницу удаления элемента.
     * @param req Реквест.
     * @return PluginRouter c запрашиваемой страницей.
     * @throws DAOException Ошибка доступа к базе данных.
     * @throws WrongPageRequest Критическая ошибка в данных реквеста.
     */
    private PluginRouter getDeletePage(HttpServletRequest req) throws DAOException, WrongPageRequest {
        String object_id = req.getParameter(PluginConst.OBJECT_ID);
        if (object_id != null) {
            DBObject object = oracleDAOFactory.getObjectDAO().getById(new BigInteger(object_id));
            if (object != null) {
                req.setAttribute(PluginConst.OBJECT, object);
                return new PluginRouter("/Object/DeleteObject.jsp");
            } else {
                throw new WrongPageRequest("Оружия с таким id=" + object_id + " не существует. ");
            }
        } else {
            throw new WrongPageRequest("ID  свойства не заданн.");
        }
    }

    /**
     * Метод, удаляющий данные из базы данных.
     * @param req Реквест.
     * @return PluginRouter c запрашиваемой страницей.
     * @throws DAOException Ошибка доступа к базе данных.
     * @throws WrongPageRequest Критическая ошибка в данных реквеста.
     */
    private PluginRouter deleteData(HttpServletRequest req) throws DAOException, WrongPageRequest {
        String object_id = req.getParameter(PluginConst.OBJECT_ID);
        if (object_id != null) {
            DBObject object = oracleDAOFactory.getObjectDAO().getById(new BigInteger(object_id));
            if (object != null) {
                oracleDAOFactory.getObjectDAO().delete(new BigInteger(object_id));
                return new PluginRouter("object-action.do"
                        + "?"
                        + PluginConst.SUBACTION
                        + "="
                        + PluginConst.GET_LIST
                        + "&"
                        + PluginConst.OBJECT_TYPE_ID
                        + "="
                        + object.getObject_type_id(), false);
            } else {
                throw new WrongPageRequest("Оружия с таким id=" + object_id + " не существует. ");
            }
        } else {
            throw new WrongPageRequest("ID типа оружия не задано.");
        }
    }

    /**
     * Метод, который позволяет
     * перейти на страницу просмотра данных о элементе.
     * @param req Реквест.
     * @return PluginRouter c запрашиваемой страницей.
     * @throws DAOException Ошибка доступа к базе данных.
     * @throws WrongPageRequest Критическая ошибка в данных реквеста.
     */
    private PluginRouter getViewPage(HttpServletRequest req) throws DAOException, WrongPageRequest {
        String object_id = req.getParameter(PluginConst.OBJECT_ID);
        if (object_id != null) {
            DBObject object =
                    oracleDAOFactory.getObjectDAO().getById(new BigInteger(object_id));
            if (object != null) {
                List<Parameter> listOfPropertyValue =
                        oracleDAOFactory.getParameterDAO().getPropertyValueForObject(new BigInteger(object_id));
                List<DBObjectReference> listOfObjectReference =
                        oracleDAOFactory.getObjectReferencesDAO().getAllReferenceForObject(new BigInteger(object_id));
                Map<BigInteger, DBObject> referenceObjectMap = new HashMap<BigInteger, DBObject>();
                ObjectDAO objectDAO = oracleDAOFactory.getObjectDAO();
                for (DBObjectReference item : listOfObjectReference) {
                    referenceObjectMap.put(item.getProperty_id(), objectDAO.getById(item.getReference_object_id()));
                }
                req.setAttribute(PluginConst.OBJECT, object);
                req.setAttribute(PluginConst.PROPERTY_VALUES_LIST, listOfPropertyValue);
                req.setAttribute(PluginConst.REFERENCE_WEAPON_RESORSES, referenceObjectMap);
                return new PluginRouter("/Object/ViewObject.jsp");
            } else {
                throw new WrongPageRequest("Оружия с таким id=" + object_id + " не существует. ");
            }
        } else {
            throw new WrongPageRequest("ID типа оружия не заданно.");
        }
    }

    /**
     * Метод, который позволяет
     * просмотреть историю изменения данных об
     * оружии.
     * @param req Реквест.
     * @return PluginRouter c запрашиваемой страницей.
     * @throws DAOException Ошибка доступа к базе данных.
     * @throws WrongPageRequest Критическая ошибка в данных реквеста.
     */
    private PluginRouter getHistoryPage(HttpServletRequest req) throws DAOException, WrongPageRequest {
        String object_id = req.getParameter(PluginConst.OBJECT_ID);
        if (object_id != null) {
            DBObject object =
                    oracleDAOFactory.getObjectDAO().getById(new BigInteger(object_id));
            if (object != null) {
                List<History> objectHistory = oracleDAOFactory.getHistoryDAO().getAllForObject(object.getObject_id());
                req.setAttribute(PluginConst.OBJECT_ID, object.getObject_id());
                req.setAttribute(PluginConst.HISTORY_LIST, objectHistory);
                return new PluginRouter("/Object/HistoryTable.jsp");
            } else {
                throw new WrongPageRequest("Оружия с таким id=" + object_id + " не существует. ");
            }
        } else {
            throw new WrongPageRequest("ID типа оружия не заданно.");
        }
    }
}
